// 引入vue
import Vue from 'vue';
// 引入插件
import VueRouter from 'vue-router';
// 使用插件
Vue.use(VueRouter);

// 暴露VueRouter类

// export default new VueRouter({


// });

//注意: 重写push||replace方法,最终实现路由跳转与传递参数,
// 起始还是用人家原来的push方法

// 先把人家原有备份一份--原始push
let originPush = VueRouter.prototype.push;

// 重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
    // 面试题:call和apply区别?
    // 相同点:都可以让当前函数执行一次
    // 不同点:call传递参数用 ,隔开 apply,传递参数数组
    // call第一个参数:this
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
};


// 备份原始replace
let originReplace = VueRouter.prototype.replace;

//重写replace方法
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, () => { }, () => { })
    }
}

// 引入路由组件
import Home from '@/pages/Home';
import Login from '@/pages/Login';
import Register from '@/pages/Register';
import Search from '@/pages/Search';
// 箭头函数
const withRouter = () => {
    return new VueRouter({
        //一个路由器:管理多的路由
        routes: [
            {
                // k
                path: '/home',
                // v
                component: Home,
                // 路由原信息:额外给当前路由注册一些信息
                meta: { show: true },
                // 这里是配置对象:不能瞎写人家让你书写的K

            },
            {
                path: '/login',
                component: Login,
                meta: { show: false },
            },
            {
                path: '/register',
                component: Register,
                meta: { show: false },
            },
            {
                // 路由已经站位了,代表路由跳转到search,务必要传递params参数
                // 在站位后面加上一个?,代表params参数,可以传递,也可以不传递
                path: '/search/:keyword?',
                component: Search,
                name: 'search',
                meta: { show: true },
                // 路由组件可以传递props,三种写法
                // 第一种:对象写法
                // props:{erha:"二哈拆家",taidi:"烦人"}
                // 第二种写法:布尔值
                // 把路由当中的parmas参数作为props传递给路由组件
                // props:true
                // 第三种写法:函数写法
                // 箭头函数返回值的结果即为传递给路由组件的props[一般传递parmas,query参数]
                props: route => ({ a: route.params.keyword, b: route.query.k })
            },
            // 重定向
            {
                path: '/',
                redirect: '/home'

            }

        ],

    });
}
export default withRouter();